import { extend } from 'umi-request';

// 创建umi-request实例
const request = extend({
  prefix: process.env.REACT_APP_BASE_API || '', // 设置默认的api前缀
  timeout: 15000, // 请求超时时间
  credentials: 'include', // 跨域请求是否需要携带cookie
  headers: {
    'Content-Type': 'application/json;charset=utf-8',
  },
  errorHandler: (error) => {
    // 统一错误处理
    const { response } = error;
    if (response && response.status) {
      const { status } = response;
      let errorMsg = '网络错误';
      
      switch (status) {
        case 400:
          errorMsg = '请求错误';
          break;
        case 401:
          errorMsg = '未授权，请登录';
          // 可以在这里处理登出逻辑
          localStorage.removeItem('token');
          window.location.reload();
          break;
        case 403:
          errorMsg = '拒绝访问';
          break;
        case 404:
          errorMsg = '请求地址出错';
          break;
        case 408:
          errorMsg = '请求超时';
          break;
        case 500:
          errorMsg = '服务器内部错误';
          break;
        case 501:
          errorMsg = '服务未实现';
          break;
        case 502:
          errorMsg = '网关错误';
          break;
        case 503:
          errorMsg = '服务不可用';
          break;
        case 504:
          errorMsg = '网关超时';
          break;
        case 505:
          errorMsg = 'HTTP版本不受支持';
          break;
        default:
          errorMsg = `未知错误(${status})`;
      }
      
      console.error('响应错误:', errorMsg);
    }
    throw error;
  },
});

// 请求拦截器
request.interceptors.request.use((url, options) => {
  // 在请求发送之前做一些处理
  const token = localStorage.getItem('token');
  if (token) {
    // 让每个请求携带token
    const headers = {
      ...options.headers,
      Authorization: `Bearer ${token}`,
    };
    return {
      url,
      options: { ...options, headers },
    };
  }
  return { url, options };
});

// 响应拦截器
request.interceptors.response.use((response) => {
  return response.clone().json().then((data) => {
    // 根据自定义错误码判断请求是否成功
    if (data.code && data.code !== 200) {
      // 处理业务错误
      const errorMsg = data.message || '未知错误';
      console.error('业务错误:', errorMsg);
      
      // 401: 未登录或token过期
      if (data.code === 401) {
        // 可以在这里处理登出逻辑
        localStorage.removeItem('token');
        window.location.reload();
      }
      
      throw new Error(errorMsg);
    }
    return data;
  }).catch(() => {
    // 如果不是JSON格式，直接返回response
    return response;
  });
});

/**
 * 封装GET请求
 * @param {string} url - 请求地址
 * @param {object} params - 请求参数
 * @param {object} options - 额外配置
 * @returns {Promise}
 */
export function get(url, params = {}, options = {}) {
  return request(url, {
    method: 'GET',
    params,
    ...options,
  });
}

/**
 * 封装POST请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 额外配置
 * @returns {Promise}
 */
export function post(url, data = {}, options = {}) {
  return request(url, {
    method: 'POST',
    data,
    ...options,
  });
}

/**
 * 封装PUT请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 额外配置
 * @returns {Promise}
 */
export function put(url, data = {}, options = {}) {
  return request(url, {
    method: 'PUT',
    data,
    ...options,
  });
}

/**
 * 封装DELETE请求
 * @param {string} url - 请求地址
 * @param {object} data - 请求数据
 * @param {object} options - 额外配置
 * @returns {Promise}
 */
export function del(url, data = {}, options = {}) {
  return request(url, {
    method: 'DELETE',
    data,
    ...options,
  });
}

// 导出请求方法
export default {
  get,
  post,
  put,
  delete: del,
  // 导出request实例，方便自定义请求
  request
};



// // 导入方式1：按需导入
// import { get, post, put, del } from './src/unils/request.js';

// // 导入方式2：默认导入
// import request from './src/unils/request.js';

// // GET请求
// get('/api/users', { page: 1, size: 10 });
// request.get('/api/users', { page: 1, size: 10 });

// // POST请求
// post('/api/users', { name: '张三', age: 25 });
// request.post('/api/users', { name: '张三', age: 25 });

// // PUT请求
// put('/api/users/1', { name: '李四', age: 30 });
// request.put('/api/users/1', { name: '李四', age: 30 });

// // DELETE请求
// del('/api/users/1');
// request.delete('/api/users/1');